home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus Special 21 / AMIGAplus Sonderheft 21 (1999)(ICP)(DE)[!].iso / PublicDomain / System / recoverdeldir / c / SFSDeldirName.c < prev   
C/C++ Source or Header  |  1999-08-23  |  3KB  |  127 lines

  1.  
  2. #include <dos/dos.h>
  3. #include <dos/dosextens.h>
  4. #include <utility/tagitem.h>
  5.  
  6. #include <clib/dos_protos.h>
  7. #include <clib/exec_protos.h>
  8.  
  9. #include <pragmas/dos_pragmas.h>
  10. #include <pragmas/exec_pragmas.h>
  11.  
  12. #include <stdio.h>
  13.  
  14. #include "fs/packets.h"
  15. #include "fs/query.h"
  16. #include "fs/nodes.h"
  17.  
  18. // sfs special, doesn't work with 1.13, methinks
  19. // SFS 1.53: works
  20.  
  21. long __saveds progstart (void)
  22. {
  23.     static  const char  VersionString[] = {"\0$VER: SFSDeldirName 1.2 " __AMIGADATE__" ©1999 Thomas Krafzik\r\n"};
  24.  
  25.     UBYTE               template[]      = "DEVICE/A\n";
  26.  
  27.     LONG                error           = RETURN_OK;
  28.  
  29.     char                *arg            = NULL;
  30.     struct RDArgs       *rdargs;
  31.  
  32.     struct ExecBase     *SysBase;
  33.     struct DosLibrary   *DOSBase;
  34.  
  35.     // Zuerst SysBase, sonst geht alles schief
  36.     SysBase = * (struct ExecBase **) 4L;
  37.  
  38.     if (DOSBase = (struct DosLibrary *) OpenLibrary ("dos.library", 37L))
  39.     {
  40.         if (rdargs = ReadArgs (template, (LONG *) &arg, 0))
  41.         {
  42.             struct MsgPort *msgport;
  43.             struct DosList *doslist;
  44.             UBYTE          *devname = arg;
  45.  
  46.             // eventuell eingegebenen Doppelpunkt eliminieren
  47.             // in der DosList sind die Geräte nur ohne Doppelpunkt anzutreffen
  48.             while (*devname)
  49.             {
  50.                 if (*devname == ':')
  51.                 {
  52.                     *devname = 0;
  53.                     break;
  54.                 }
  55.                 devname++;
  56.             }
  57.  
  58.             // DosList vorbereiten
  59.             doslist = LockDosList (LDF_DEVICES | LDF_READ);
  60.  
  61.             // Gerät vorhanden ?
  62.             if (doslist = FindDosEntry (doslist, arg, LDF_DEVICES))
  63.             {
  64.                 struct TagItem tags[] = {ASQ_HAS_RECYCLED, 0};
  65.  
  66.                 // MsgPort des FileSystems
  67.                 msgport = doslist->dol_Task;
  68.  
  69.                 // DosList wieder freigeben
  70.                 UnLockDosList (LDF_DEVICES | LDF_READ);
  71.  
  72.                 // Packet synchron verschicken: ACTION_SFS_QUERY
  73.                 if (DoPkt (msgport, ACTION_SFS_QUERY, (LONG) &tags, 0, 0, 0, 0))
  74.                 {
  75.                     // Etwas dabei herausgekommen ?
  76.                     if (tags[0].ti_Data)
  77.                     {
  78.                         BPTR lock;
  79.                         char buffer [512];
  80.  
  81.                         // Packet synchron verschicken: ACTION_SFS_LOCATE_OBJECT
  82.                         if (lock = DoPkt (msgport, ACTION_SFS_LOCATE_OBJECT, RECYCLEDNODE, SHARED_LOCK, 0, 0, 0))
  83.                         {
  84.                             // Mit dem Lock können wir nicht viel anfangen,
  85.                             // also holen wir uns den passenden Namen
  86.                             NameFromLock (MKBADDR (lock), buffer, 256);
  87.                             Printf ("%s", FilePart (buffer));
  88.                         }
  89.                         else
  90.                         {
  91.                             Printf ("0");
  92.                             error = RETURN_WARN;
  93.                         }
  94.                     }
  95.                     else
  96.                     {
  97.                         Printf ("0");
  98.                         error = RETURN_WARN;
  99.                     }
  100.                 }
  101.                 else
  102.                 {
  103.                     Printf ("-1");
  104.                     error = RETURN_ERROR;
  105.                 }
  106.             }
  107.             else
  108.             {
  109.                 UnLockDosList (LDF_DEVICES | LDF_READ);
  110.                 Printf ("-1");
  111.                 error = RETURN_ERROR;
  112.             }
  113.  
  114.             // DosList wieder freigeben
  115.             FreeArgs (rdargs);
  116.         }
  117.         else
  118.         {
  119.             Printf ("-1");
  120.             error = RETURN_FAIL;
  121.         }
  122.         CloseLibrary ((struct Library *) DOSBase);
  123.     }
  124.     return (error);
  125. }
  126.  
  127.